package persistencia;

import java.util.ArrayList;
import java.util.List;


/**
 * Classe abstrata que contem metodos de salvar e carregar dados (comportamento
 * em comum entre as classes filhas), gerenciando a manipulacao do banco de
 * dados
 * 
 * @author Grupo 3
 * 
 * @param <T>
 *            O tipo de lista de objetos a ser manipulado
 */
public abstract class Gerenciador<T> {
	private Serializador<List<T>> serializador;
	private List<T> objetos;

	/**
	 * Carrega todos os dados de um arquivo xml
	 * 
	 * @return Uma lista com todos os dados do arquivo
	 */

	public List<T> carregarDados() {
		serializador = new Serializador<List<T>>();
		objetos = serializador.recuperar(nomeArquivo());
		if (objetos == null) {
			objetos = new ArrayList<T>();
		}
		return objetos;
	}

	/**
	 * Retorna o nome do arquivo a ser manipulado
	 * 
	 * @return O nome do arquivo
	 */
	protected abstract String nomeArquivo();

	/**
	 * Salva dados em um arquivo xml
	 */
	public void salvarDados() {
		serializador.salvar(nomeArquivo(), getLista());
	}

	/**
	 * Permite as clases filhas a manipulacao da lista de objetos do tipo T
	 * 
	 * @return A lista de objetos do tipo T
	 */
	protected List<T> getLista() {
		return objetos;
	}

	/**
	 * Adiciona um objeto ao banco de dados
	 * 
	 * @param objeto
	 *            O objeto a ser adicionado
	 */
	public void adicionaObjeto(T objeto) {

		getLista().add(objeto);
		salvarDados();

	}

	/**
	 * Remove um objeto do banco de dados
	 * 
	 * @param objeto
	 *            O objeto a ser removido
	 */
	public void removeObjeto(T objeto) {
		getLista().remove(objeto);
		salvarDados();
	}
}
